]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
dbusServices/notifications: Add a separate notification daemon
authorFlorian Müllner <fmuellner@gnome.org>
Thu, 16 May 2019 19:08:06 +0000 (21:08 +0200)
committerFlorian Müllner <florian.muellner@gmail.com>
Thu, 12 Mar 2020 16:09:27 +0000 (16:09 +0000)
Add a small service that exposes the Fdo notification API under the
well-known name, and forwards any requests to the actual implementation
in the shell.

That way any app with permission to talk to org.freedesktop.Notifications
will get exactly that, and nothing more.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/547

js/dbusServices/meson.build
js/dbusServices/notifications/main.js [new file with mode: 0644]
js/dbusServices/notifications/notificationDaemon.js [new file with mode: 0644]
js/dbusServices/org.gnome.Shell.Notifications.src.gresource.xml [new file with mode: 0644]

index c2c4d6392fdaeed5fa24ba4bd3772b08e5a00a89..2cca6544fa402c12cb06814d78bbefd76a4ca07c 100644 (file)
@@ -4,6 +4,7 @@ launcherconf.set('prefix', prefix)
 launcherconf.set('libdir', libdir)
 
 dbus_services = {
+  'org.gnome.Shell.Notifications': 'notifications',
 }
 
 config_dir = '@0@/..'.format(meson.current_build_dir())
diff --git a/js/dbusServices/notifications/main.js b/js/dbusServices/notifications/main.js
new file mode 100644 (file)
index 0000000..7944cd1
--- /dev/null
@@ -0,0 +1,11 @@
+/* exported main */
+
+const { DBusService } = imports.dbusService;
+const { NotificationDaemon } = imports.notificationDaemon;
+
+function main() {
+    const service = new DBusService(
+        'org.gnome.Shell.Notifications',
+        new NotificationDaemon());
+    service.run();
+}
diff --git a/js/dbusServices/notifications/notificationDaemon.js b/js/dbusServices/notifications/notificationDaemon.js
new file mode 100644 (file)
index 0000000..c2d2ef6
--- /dev/null
@@ -0,0 +1,80 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+/* exported NotificationDaemon */
+
+const { Gio, GLib } = imports.gi;
+
+const { loadInterfaceXML } = imports.misc.fileUtils;
+const { ServiceImplementation } = imports.dbusService;
+
+const NotificationsIface = loadInterfaceXML('org.freedesktop.Notifications');
+const NotificationsProxy = Gio.DBusProxy.makeProxyWrapper(NotificationsIface);
+
+var NotificationDaemon = class extends ServiceImplementation {
+    constructor() {
+        super(NotificationsIface, '/org/freedesktop/Notifications');
+
+        this._autoShutdown = false;
+
+        this._proxy = new NotificationsProxy(Gio.DBus.session,
+            'org.gnome.Shell',
+            '/org/freedesktop/Notifications',
+            (proxy, error) => {
+                if (error)
+                    log(error.message);
+            });
+
+        this._proxy.connectSignal('ActionInvoked',
+            (proxy, sender, params) => {
+                this._dbusImpl.emit_signal('ActionInvoked',
+                    new GLib.Variant('(us)', params));
+            });
+        this._proxy.connectSignal('NotificationClosed',
+            (proxy, sender, params) => {
+                this._dbusImpl.emit_signal('NotificationClosed',
+                    new GLib.Variant('(uu)', params));
+            });
+    }
+
+    register() {
+        Gio.DBus.session.own_name(
+            'org.freedesktop.Notifications',
+            Gio.BusNameOwnerFlags.REPLACE,
+            null, null);
+    }
+
+    NotifyAsync(params, invocation) {
+        this._proxy.NotifyRemote(...params, (res, error) => {
+            if (this._handleError(invocation, error))
+                return;
+
+            invocation.return_value(new GLib.Variant('(u)', res));
+        });
+    }
+
+    CloseNotificationAsync(params, invocation) {
+        this._proxy.CloseNotificationRemote(...params, (res, error) => {
+            if (this._handleError(invocation, error))
+                return;
+
+            invocation.return_value(null);
+        });
+    }
+
+    GetCapabilitiesAsync(params, invocation) {
+        this._proxy.GetCapabilitiesRemote(...params, (res, error) => {
+            if (this._handleError(invocation, error))
+                return;
+
+            invocation.return_value(new GLib.Variant('(as)', res));
+        });
+    }
+
+    GetServerInformationAsync(params, invocation) {
+        this._proxy.GetServerInformationRemote(...params, (res, error) => {
+            if (this._handleError(invocation, error))
+                return;
+
+            invocation.return_value(new GLib.Variant('(ssss)', res));
+        });
+    }
+};
diff --git a/js/dbusServices/org.gnome.Shell.Notifications.src.gresource.xml b/js/dbusServices/org.gnome.Shell.Notifications.src.gresource.xml
new file mode 100644 (file)
index 0000000..ccf0e98
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+  <gresource prefix="/org/gnome/Shell/Notifications/js">
+    <file>main.js</file>
+    <file>notificationDaemon.js</file>
+    <file>dbusService.js</file>
+
+    <file>misc/config.js</file>
+    <file>misc/fileUtils.js</file>
+  </gresource>
+</gresources>